#ifndef ARBOLSINTACTICO_H_
#define ARBOLSINTACTICO_H_
#include <fstream>
#include "string.h"
#include <sstream>
#include <iostream>
#include <stack>
#include "nodo.h"
#include "Logger.h"
using namespace std;

class ArbolSintactico {
private:

	string pathYAML;
	Nodo* raiz;
	Nodo* nodoActual;
	bool esVacio(string s);
	bool tieneCaracteresInvalidos(string s);
	void chequearPalabra(string &s, string padre);
	string agregarBlancos(string s);


public:
	ArbolSintactico(Nodo* raiz);
	ArbolSintactico(string fichero);
	ArbolSintactico();

	void setPathArchivo(string path) { this->pathYAML=path;}
	void setNodoActual(Nodo* actual);

	void cargarArbol();
	//void cargarArbolRecursivo(stack<Nodo*> pilaNodos,ifstream& archivo);
	void cargarArbolRecursivo(stack<Nodo*> pilaNodos, ifstream& archivo,int & numLinea);

	Nodo* buscarNodo(string buscado);
	void buscarRecursivo(Nodo* nodo,Nodo*& encontrado, string buscado);

	Nodo* getRaiz();

	void normalizar();
	void normalizarRecursivo(Nodo* nodo, stack<Nodo*> pila);

	int existeShift(stack<Nodo*> pilaNodos, Nodo* nuevoNodo);

	Nodo* getNodoActual();

	void imprimir();

	void detectorErrores(Logger* logger,Nodo* nodo,string rutaYAML);

	virtual ~ArbolSintactico();
};

#endif /* ARBOLSINTACTICO_H_ */
